import axios from 'axios';
import router from '../router';
import { Notification } from 'element-ui';
// import NProgress from 'nprogress'

// 1. 接口的统一管理
// 2. 对数据返回的错误信息 统一处理
// 3. 请求过程中，我们可以做一些事情，比如：loading，请求头的添加，请求参数的添加，请求的取消，请求的超时处理
// 4. 响应的拦截器，对响应的数据进行统一处理

// code 验证 
// http 状态码 一般由后端和前端协商来定
const codeMessage = {
    200: '服务器成功返回请求的数据。',
    201: '新建或修改数据成功。',
    202: '一个请求已经进入后台排队（异步任务）。',
    204: '删除数据成功。',
    400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
    401: '用户没有权限（令牌、用户名、密码错误）。',
    403: '用户得到授权，但是访问是被禁止的。',
    404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
    406: '请求的格式不可得。',
    410: '请求的资源被永久删除，且不会再得到的。',
    422: '当创建一个对象时，发生一个验证错误。',
    500: '服务器发生错误，请检查服务器。',
    502: '网关错误。',
    501: '网络错误信息。',
    503: '服务不可用，服务器暂时过载或维护。',
    504: '网关超时。',
};

// 基准路径
// api === http://111.203.59.61:8065/prod-api/
// axios.defaults.baseURL = '/api';

// 请求超时时间
axios.defaults.timeout = 6000; // 6s

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么

    // 请求的时候触发loding 开始
    // NProgress.start();

    // 请求头添加token
    // config.headers['Content-Type'] = 'application/json;charset=UTF-8';

    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(responseCodes, responseMessage);

// 响应拦截器 在响应的时候我们要处理状态码
function responseCodes(response) {

    // 响应的时候 关闭
    // NProgress.done();

    // 对响应数据做点什么
    if(response.status >= 200 && response.status <= 300) {
        return response;
    }

    // 获取错误信息
    const errorText = codeMessage[response.status] || response.statusText;

    // 抛出错误
    const error = new Error(errorText);

    // 用element 全局错误提示
    Notification.error({
        title: response.data.code,
        message: `错误信息为：${errorText}`,
    });

    error.name = response.data.code;
    throw error;
}

function responseMessage(error) {
    // 对响应错误做点什么
    // if(error.response.data.code === 500) {
    //     router.push('/500')
    // }
    // if(error.response.data.code === 404) {
    //     router.push('/404')
    // }
    return Promise.reject(error);
}


//      /api/login === http://111.203.59.61:8065/prod-api/login
// axios.post('/login')

// 封装get请求
// @param url 请求地址
// @param params 请求参数
// @returns {Promise}
export const UrlGet = async (url, parmas = {}) => await axios.get(url, parmas)

// 封装post请求
// @param url 请求地址
// @param params 请求参数
// @returns {Promise}
export const UrlPost = async (url, parmas = {}) => await axios.post(url, parmas)

// 封装put请求
// @param url 请求地址
// @param params 请求参数
// @returns {Promise}
export const UrlPut = async (url, parmas = {}) => await axios.put(url, parmas)

// 封装删除请求
// @param url 请求地址
// @param params 请求参数
// @returns {Promise}
export const UrlDelete = async (url, parmas = {}) => await axios.delete(url, parmas)